"""
1、利用给定的一组坐标，实现三次Hermite插值曲线绘制，该曲线绘制成一个函数形式
2、利用给定一组坐标，绘制出三次Bezier曲线，该曲线绘制成一个函数形式
3、利用给定一组坐标，绘制出三次B样条曲线，该曲线绘制成一个函数形式
以上坐标可以自拟
"""
#引入库
import numpy as np
import matplotlib.pyplot as plt


# region 三次hermite差值曲线
#此函数用于在t时刻的插值点坐标
def operate_Hermite(i):
    #p1,p2,p3,p4为已知的四个点
    p11 = p1
    p22 = p3
    p33 = [(p2[0] - p1[0]), (p2[1] - p1[1])]
    p44 = [(p4[0] - p3[0]), (p4[1] - p3[1])]
    #t为插值点位置
    t = i * 1.0
    t2 = t * t
    t3 = t2 * t

    a1 = 2 * t3 - 3 * t2 + 1
    a2 = -2 * t3 + 3 * t2
    a3 = t3 - 2 * t2 + t
    a4 = t3 - t2

    x = a1 * p11[0] + a2 * p22[0] + a3 * p33[0] + a4 * p44[0]
    y = a1 * p11[1] + a2 * p22[1] + a3 * p33[1] + a4 * p44[1]
    return [x, y]


def compute_hermite():
    t_values = np.linspace(0, 1, 1000)
    items = []
    for i in t_values:
        items.append(operate_Hermite(i))
    return items


# endregion


if __name__ == '__main__':
    # 创建一个全为0的二维数组
    img = np.zeros([500, 500], dtype=np.uint8)

    # 填充255表示白色
    img.fill(255)

    p1 = [100, 100]
    p2 = [200, 300]
    p3 = [300, 200]
    p4 = [400, 500]

    items1 = compute_hermite()
    for i in items1:
        x = int(i[0])
        y = int(i[1])
        img[x, y] = 0

    # 由于imshow默认的坐标系是左上角为原点，所以需要转换一下
    img = np.transpose(img)
    plt.title('hermite')
    plt.imshow(img, cmap='gray', origin='lower')
    # 显示图片
    plt.show()
